필요 모듈 가져오기¶

In [2]:
from tensorflow import keras
from keras.models import load_model
from sklearn.metrics import f1_score
import pandas as pd
import numpy as np


from Preprocessing import make_user_df, make_label_df
from datasplit import split
from SP_Model import MRCnnModel
from GpsVS import get_gps, diplay_SP

데이터 불러오기¶

In [ ]:
path = "D:\\23" # 필요에 맞춰 바꾸기
In [ ]:
 
In [ ]:
e4_df = make_user_df(path, duplicated = False #ex) ./user01-06/user01-06 이런식으로 중복된 경우는 True, 아닌 경우는 False
                    )
100%|████████████████████████████████████████████████████████████████████████████████| 5/5 [4:59:03<00:00, 3588.64s/it]
In [ ]:
label_df = make_label_df(path, duplicated = False #ex) ./user01-06/user01-06 이런식으로 중복된 경우는 True, 아닌 경우는 False
                    )
100%|████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:23<00:00,  4.66s/it]
In [ ]:
e4_df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 18969600 entries, 27 to 19218720
Data columns (total 10 columns):
 #   Column           Dtype  
---  ------           -----  
 0   timestamp        float64
 1   e4Temp_temp      float64
 2   user             object 
 3   timestamp_large  int32  
 4   e4Hr_hr          float64
 5   e4Eda_eda        float64
 6   e4Bvp_value      float64
 7   e4Acc_x          float64
 8   e4Acc_y          float64
 9   e4Acc_z          float64
dtypes: float64(8), int32(1), object(1)
memory usage: 1.5+ GB
In [ ]:
e4_df.head()
Out[ ]:
timestamp e4Temp_temp user timestamp_large e4Hr_hr e4Eda_eda e4Bvp_value e4Acc_x e4Acc_y e4Acc_z
27 0.0 34.03 user01 1598833320 92.93 0.470662 -33.452656 -0.510742 -0.223633 0.727539
28 1.0 34.00 user01 1598833320 92.62 0.447930 -41.560156 -0.087402 -0.750488 0.455078
29 2.0 33.99 user01 1598833320 92.33 0.420075 42.538906 -0.949707 -0.159668 -0.377441
30 3.0 34.00 user01 1598833320 92.26 0.431281 -146.084062 -0.752930 -0.024414 0.459961
31 4.0 34.00 user01 1598833320 92.19 0.415272 229.621563 -0.835449 0.075684 -0.386719
In [ ]:
label_df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 440830 entries, 0 to 754
Data columns (total 14 columns):
 #   Column               Non-Null Count   Dtype  
---  ------               --------------   -----  
 0   ts                   440830 non-null  float64
 1   action               440830 non-null  object 
 2   actionOption         440830 non-null  int64  
 3   actionSub            95860 non-null   object 
 4   actionSubOption      95860 non-null   float64
 5   condition            440830 non-null  object 
 6   conditionSub1Option  207576 non-null  float64
 7   conditionSub2Option  207576 non-null  float64
 8   place                440830 non-null  object 
 9   emotionPositive      440830 non-null  int64  
 10  emotionTension       440830 non-null  int64  
 11  activity             440830 non-null  int64  
 12  user                 440830 non-null  object 
 13  timestamp            440830 non-null  int32  
dtypes: float64(4), int32(1), int64(4), object(5)
memory usage: 48.8+ MB
In [ ]:
label_df.head()
Out[ ]:
ts action actionOption actionSub actionSubOption condition conditionSub1Option conditionSub2Option place emotionPositive emotionTension activity user timestamp
0 1.598760e+09 work 212 NaN NaN WITH_MANY 4.0 3.0 other_indoor 5 7 3 user01 1598759880
1 1.598760e+09 work 212 NaN NaN WITH_MANY 4.0 3.0 other_indoor 5 7 3 user01 1598759880
2 1.598760e+09 work 212 NaN NaN WITH_MANY 4.0 3.0 other_indoor 5 7 3 user01 1598759880
3 1.598760e+09 work 212 NaN NaN WITH_MANY 4.0 3.0 other_indoor 5 7 3 user01 1598759880
4 1.598760e+09 work 212 NaN NaN WITH_MANY 4.0 3.0 other_indoor 5 7 3 user01 1598759880

데이터 분할¶

In [ ]:
x_train, x_valid, x_test, x_visual, y_train, y_valid, y_test, visual_target = split(e4_df, label_df, "user25", seed1 = 42, seed2 = 42)
In [ ]:
print("x_train :",x_train.shape)
print("x_valid :",x_valid.shape)
print("x_test :",x_test.shape)
print("x_visual :",x_visual.shape)
print("y_train :",y_train.shape)
print("y_valid :",y_valid.shape)
print("y_test :",y_test.shape)
print("visual_target :",visual_target.shape)
x_train : (205246, 60, 7)
x_valid : (29321, 60, 7)
x_test : (58642, 60, 7)
x_visual : (19353, 60, 7)
y_train : (205246,)
y_valid : (29321,)
y_test : (58642,)
visual_target : (19353, 3)

모델링¶

모델 정의¶

In [13]:
model = MRCnnModel()
In [10]:
encoded_y_train = model.Encode(y_train)
encoded_y_valid = model.Encode(y_valid)

모델 학습¶

In [ ]:
model.fit(x_train, encoded_y_train ,x_valid, encoded_y_valid, epochsize = 1000, savename = "model_cnn") #model_cnn.h5 생성됨ㅡ
Epoch 1/1000
3207/3207 [==============================] - ETA: 0s - loss: 1.2808 - accuracy: 0.4613
Epoch 1: val_loss improved from inf to 1.37139, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 54s 12ms/step - loss: 1.2808 - accuracy: 0.4613 - val_loss: 1.3714 - val_accuracy: 0.4120 - lr: 0.0010
Epoch 2/1000
3203/3207 [============================>.] - ETA: 0s - loss: 1.2167 - accuracy: 0.4981
Epoch 2: val_loss did not improve from 1.37139
3207/3207 [==============================] - 38s 12ms/step - loss: 1.2167 - accuracy: 0.4981 - val_loss: 1.3912 - val_accuracy: 0.4024 - lr: 0.0010
Epoch 3/1000
3204/3207 [============================>.] - ETA: 0s - loss: 1.1861 - accuracy: 0.5155
Epoch 3: val_loss improved from 1.37139 to 1.25353, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 39s 12ms/step - loss: 1.1861 - accuracy: 0.5155 - val_loss: 1.2535 - val_accuracy: 0.4843 - lr: 0.0010
Epoch 4/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.1649 - accuracy: 0.5263
Epoch 4: val_loss improved from 1.25353 to 1.22445, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 39s 12ms/step - loss: 1.1649 - accuracy: 0.5263 - val_loss: 1.2245 - val_accuracy: 0.4932 - lr: 0.0010
Epoch 5/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.1464 - accuracy: 0.5341
Epoch 5: val_loss did not improve from 1.22445
3207/3207 [==============================] - 37s 12ms/step - loss: 1.1463 - accuracy: 0.5341 - val_loss: 1.2485 - val_accuracy: 0.4862 - lr: 0.0010
Epoch 6/1000
3206/3207 [============================>.] - ETA: 0s - loss: 1.1302 - accuracy: 0.5432
Epoch 6: val_loss improved from 1.22445 to 1.17509, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 38s 12ms/step - loss: 1.1302 - accuracy: 0.5432 - val_loss: 1.1751 - val_accuracy: 0.5191 - lr: 0.0010
Epoch 7/1000
3207/3207 [==============================] - ETA: 0s - loss: 1.1174 - accuracy: 0.5498
Epoch 7: val_loss did not improve from 1.17509
3207/3207 [==============================] - 37s 12ms/step - loss: 1.1174 - accuracy: 0.5498 - val_loss: 1.2196 - val_accuracy: 0.5172 - lr: 0.0010
Epoch 8/1000
3206/3207 [============================>.] - ETA: 0s - loss: 1.1048 - accuracy: 0.5557
Epoch 8: val_loss did not improve from 1.17509
3207/3207 [==============================] - 36s 11ms/step - loss: 1.1048 - accuracy: 0.5557 - val_loss: 1.2948 - val_accuracy: 0.4882 - lr: 0.0010
Epoch 9/1000
3207/3207 [==============================] - ETA: 0s - loss: 1.0922 - accuracy: 0.5619
Epoch 9: val_loss improved from 1.17509 to 1.15991, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 37s 12ms/step - loss: 1.0922 - accuracy: 0.5619 - val_loss: 1.1599 - val_accuracy: 0.5344 - lr: 0.0010
Epoch 10/1000
3207/3207 [==============================] - ETA: 0s - loss: 1.0830 - accuracy: 0.5661
Epoch 10: val_loss did not improve from 1.15991
3207/3207 [==============================] - 37s 11ms/step - loss: 1.0830 - accuracy: 0.5661 - val_loss: 1.2156 - val_accuracy: 0.5131 - lr: 0.0010
Epoch 11/1000
3203/3207 [============================>.] - ETA: 0s - loss: 1.0727 - accuracy: 0.5704
Epoch 11: val_loss improved from 1.15991 to 1.10258, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 38s 12ms/step - loss: 1.0727 - accuracy: 0.5704 - val_loss: 1.1026 - val_accuracy: 0.5558 - lr: 0.0010
Epoch 12/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.0649 - accuracy: 0.5748
Epoch 12: val_loss did not improve from 1.10258
3207/3207 [==============================] - 37s 11ms/step - loss: 1.0649 - accuracy: 0.5748 - val_loss: 1.1232 - val_accuracy: 0.5456 - lr: 0.0010
Epoch 13/1000
3207/3207 [==============================] - ETA: 0s - loss: 1.0562 - accuracy: 0.5778
Epoch 13: val_loss did not improve from 1.10258
3207/3207 [==============================] - 36s 11ms/step - loss: 1.0562 - accuracy: 0.5778 - val_loss: 1.1452 - val_accuracy: 0.5388 - lr: 0.0010
Epoch 14/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.0481 - accuracy: 0.5831
Epoch 14: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.

Epoch 14: val_loss did not improve from 1.10258
3207/3207 [==============================] - 36s 11ms/step - loss: 1.0481 - accuracy: 0.5831 - val_loss: 1.1032 - val_accuracy: 0.5569 - lr: 0.0010
Epoch 15/1000
3204/3207 [============================>.] - ETA: 0s - loss: 1.0189 - accuracy: 0.5954
Epoch 15: val_loss improved from 1.10258 to 1.06693, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 37s 12ms/step - loss: 1.0189 - accuracy: 0.5955 - val_loss: 1.0669 - val_accuracy: 0.5757 - lr: 5.0000e-04
Epoch 16/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.0082 - accuracy: 0.6000
Epoch 16: val_loss improved from 1.06693 to 1.06468, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 37s 12ms/step - loss: 1.0082 - accuracy: 0.6000 - val_loss: 1.0647 - val_accuracy: 0.5762 - lr: 5.0000e-04
Epoch 17/1000
3205/3207 [============================>.] - ETA: 0s - loss: 1.0030 - accuracy: 0.6020
Epoch 17: val_loss improved from 1.06468 to 1.04538, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 37s 12ms/step - loss: 1.0030 - accuracy: 0.6019 - val_loss: 1.0454 - val_accuracy: 0.5864 - lr: 5.0000e-04
Epoch 18/1000
3204/3207 [============================>.] - ETA: 0s - loss: 0.9965 - accuracy: 0.6062
Epoch 18: val_loss did not improve from 1.04538
3207/3207 [==============================] - 37s 11ms/step - loss: 0.9965 - accuracy: 0.6062 - val_loss: 1.2589 - val_accuracy: 0.5312 - lr: 5.0000e-04
Epoch 19/1000
3203/3207 [============================>.] - ETA: 0s - loss: 0.9901 - accuracy: 0.6085
Epoch 19: val_loss improved from 1.04538 to 1.03908, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9901 - accuracy: 0.6086 - val_loss: 1.0391 - val_accuracy: 0.5852 - lr: 5.0000e-04
Epoch 20/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9853 - accuracy: 0.6109
Epoch 20: val_loss did not improve from 1.03908
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9853 - accuracy: 0.6109 - val_loss: 1.0805 - val_accuracy: 0.5717 - lr: 5.0000e-04
Epoch 21/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.9810 - accuracy: 0.6130
Epoch 21: val_loss improved from 1.03908 to 1.03078, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9810 - accuracy: 0.6130 - val_loss: 1.0308 - val_accuracy: 0.5905 - lr: 5.0000e-04
Epoch 22/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9770 - accuracy: 0.6142
Epoch 22: val_loss did not improve from 1.03078
3207/3207 [==============================] - 36s 11ms/step - loss: 0.9770 - accuracy: 0.6142 - val_loss: 1.1020 - val_accuracy: 0.5693 - lr: 5.0000e-04
Epoch 23/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9703 - accuracy: 0.6175
Epoch 23: val_loss did not improve from 1.03078
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9702 - accuracy: 0.6175 - val_loss: 1.0392 - val_accuracy: 0.5859 - lr: 5.0000e-04
Epoch 24/1000
3207/3207 [==============================] - ETA: 0s - loss: 0.9682 - accuracy: 0.6189
Epoch 24: ReduceLROnPlateau reducing learning rate to 0.0002500000118743628.

Epoch 24: val_loss did not improve from 1.03078
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9682 - accuracy: 0.6189 - val_loss: 1.0652 - val_accuracy: 0.5767 - lr: 5.0000e-04
Epoch 25/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9495 - accuracy: 0.6261
Epoch 25: val_loss did not improve from 1.03078
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9495 - accuracy: 0.6261 - val_loss: 1.0438 - val_accuracy: 0.5887 - lr: 2.5000e-04
Epoch 26/1000
3204/3207 [============================>.] - ETA: 0s - loss: 0.9424 - accuracy: 0.6299
Epoch 26: val_loss did not improve from 1.03078
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9424 - accuracy: 0.6299 - val_loss: 1.0604 - val_accuracy: 0.5776 - lr: 2.5000e-04
Epoch 27/1000
3203/3207 [============================>.] - ETA: 0s - loss: 0.9399 - accuracy: 0.6312
Epoch 27: val_loss improved from 1.03078 to 1.02457, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9400 - accuracy: 0.6312 - val_loss: 1.0246 - val_accuracy: 0.5930 - lr: 2.5000e-04
Epoch 28/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9368 - accuracy: 0.6310
Epoch 28: val_loss did not improve from 1.02457
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9368 - accuracy: 0.6310 - val_loss: 1.0279 - val_accuracy: 0.5933 - lr: 2.5000e-04
Epoch 29/1000
3204/3207 [============================>.] - ETA: 0s - loss: 0.9350 - accuracy: 0.6327
Epoch 29: val_loss did not improve from 1.02457
3207/3207 [==============================] - 37s 11ms/step - loss: 0.9349 - accuracy: 0.6327 - val_loss: 1.0381 - val_accuracy: 0.5906 - lr: 2.5000e-04
Epoch 30/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.9327 - accuracy: 0.6339
Epoch 30: ReduceLROnPlateau reducing learning rate to 0.0001250000059371814.

Epoch 30: val_loss did not improve from 1.02457
3207/3207 [==============================] - 37s 11ms/step - loss: 0.9327 - accuracy: 0.6339 - val_loss: 1.0343 - val_accuracy: 0.5942 - lr: 2.5000e-04
Epoch 31/1000
3207/3207 [==============================] - ETA: 0s - loss: 0.9210 - accuracy: 0.6383
Epoch 31: val_loss improved from 1.02457 to 1.01033, saving model to ./model_checkpoint.h5
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9210 - accuracy: 0.6383 - val_loss: 1.0103 - val_accuracy: 0.6030 - lr: 1.2500e-04
Epoch 32/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.9173 - accuracy: 0.6406
Epoch 32: val_loss did not improve from 1.01033
3207/3207 [==============================] - 37s 12ms/step - loss: 0.9173 - accuracy: 0.6406 - val_loss: 1.0144 - val_accuracy: 0.5998 - lr: 1.2500e-04
Epoch 33/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.9152 - accuracy: 0.6415
Epoch 33: val_loss did not improve from 1.01033
3207/3207 [==============================] - 37s 11ms/step - loss: 0.9152 - accuracy: 0.6414 - val_loss: 1.0140 - val_accuracy: 0.6030 - lr: 1.2500e-04
Epoch 34/1000
3207/3207 [==============================] - ETA: 0s - loss: 0.9152 - accuracy: 0.6420
Epoch 34: ReduceLROnPlateau reducing learning rate to 6.25000029685907e-05.

Epoch 34: val_loss did not improve from 1.01033
3207/3207 [==============================] - 36s 11ms/step - loss: 0.9152 - accuracy: 0.6420 - val_loss: 1.0251 - val_accuracy: 0.5997 - lr: 1.2500e-04
Epoch 35/1000
3203/3207 [============================>.] - ETA: 0s - loss: 0.9078 - accuracy: 0.6448
Epoch 35: val_loss did not improve from 1.01033
3207/3207 [==============================] - 37s 11ms/step - loss: 0.9079 - accuracy: 0.6448 - val_loss: 1.0189 - val_accuracy: 0.5979 - lr: 6.2500e-05
Epoch 36/1000
3203/3207 [============================>.] - ETA: 0s - loss: 0.9050 - accuracy: 0.6460
Epoch 36: val_loss did not improve from 1.01033
3207/3207 [==============================] - 38s 12ms/step - loss: 0.9052 - accuracy: 0.6459 - val_loss: 1.0136 - val_accuracy: 0.6032 - lr: 6.2500e-05
Epoch 37/1000
3206/3207 [============================>.] - ETA: 0s - loss: 0.9050 - accuracy: 0.6456
Epoch 37: ReduceLROnPlateau reducing learning rate to 3.125000148429535e-05.

Epoch 37: val_loss did not improve from 1.01033
3207/3207 [==============================] - 36s 11ms/step - loss: 0.9051 - accuracy: 0.6456 - val_loss: 1.0169 - val_accuracy: 0.6028 - lr: 6.2500e-05
Epoch 38/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.9016 - accuracy: 0.6470
Epoch 38: val_loss did not improve from 1.01033
3207/3207 [==============================] - 36s 11ms/step - loss: 0.9016 - accuracy: 0.6471 - val_loss: 1.0116 - val_accuracy: 0.6032 - lr: 3.1250e-05
Epoch 39/1000
3207/3207 [==============================] - ETA: 0s - loss: 0.8993 - accuracy: 0.6484
Epoch 39: val_loss did not improve from 1.01033
3207/3207 [==============================] - 37s 11ms/step - loss: 0.8993 - accuracy: 0.6484 - val_loss: 1.0119 - val_accuracy: 0.6017 - lr: 3.1250e-05
Epoch 40/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.8995 - accuracy: 0.6479
Epoch 40: ReduceLROnPlateau reducing learning rate to 1.5625000742147677e-05.

Epoch 40: val_loss did not improve from 1.01033
3207/3207 [==============================] - 37s 12ms/step - loss: 0.8996 - accuracy: 0.6479 - val_loss: 1.0108 - val_accuracy: 0.6046 - lr: 3.1250e-05
Epoch 41/1000
3205/3207 [============================>.] - ETA: 0s - loss: 0.8992 - accuracy: 0.6485
Epoch 41: val_loss did not improve from 1.01033
3207/3207 [==============================] - 36s 11ms/step - loss: 0.8991 - accuracy: 0.6485 - val_loss: 1.0110 - val_accuracy: 0.6037 - lr: 1.5625e-05
Out[ ]:
<keras.callbacks.History at 0x7f23400cbf10>

학습 결과 확인¶

In [ ]:
print(f1_score(model.predict(x_test), y_test, average = "weighted"))
1833/1833 [==============================] - 7s 3ms/step
0.6164323794246757
In [ ]:
print(f1_score(model.predict(x_test), y_test, average = "micro"))
1833/1833 [==============================] - 5s 3ms/step
0.6037311142184782

사후분석¶

In [ ]:
index_25 = model.make_SP_ts(x_visual, visual_target, where = "other_indoor") #where 옵션 : "other_indoor" 기본값, 실제 장소 판단 변경 가능
605/605 [==============================] - 2s 3ms/step
In [ ]:
print(index_25[:5])
21    1598935920
22    1598935980
23    1598936040
24    1598936100
25    1598936160
Name: timestamp_large, dtype: int64
In [3]:
df_gps = get_gps(path, "user21-25", "user25",#duplicated = True #ex) ./user01-06/user01-06 이런식으로 중복된 경우는 True, 아닌 경우는 False
                    )
100%|██████████████████████████████████████████████████████████████████████████████████| 27/27 [03:53<00:00,  8.66s/it]
In [6]:
diplay_SP(df_gps, index_25, make_html = True) #True : map.html 생성됨
Out[6]:
Make this Notebook Trusted to load map: File -> Trust Notebook